package com.corpgovernment.common.utils;

import com.corpgovernment.common.supplier.SHA256Utils;
import lombok.extern.slf4j.Slf4j;
import com.ctrip.corp.obt.generic.utils.StringUtils;

import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.stream.Collectors;

/**
 * 携程供应商请求参数封装工具类
 */
@Slf4j
public class CtripEncryptUtil {

    /**
     * 携程获取token方法
     * example：
     * key传flightSearch  对应就是返回拼装好机票查询URL的参数（供应商接口需要必传的参数请使用post方式传递）
     */
    public static String encrypt(String url) {
        /*
         * http://openservice.open.uat.ctripqa.com/openservice/serviceproxy.ashx?
         *  aid=1&sid=50&userkey=123456789&icode=b8fe73e5b13a4e85a3130cb5ea36b638
         *  &uuid=9cac39a7c6524fdbb7202d7df6cd5cbb&e=r6&mode=1&format=json
         *
         * 如果url包含? 和 aid/sid/userkey/字段  则往下走携程获取token逻辑  否则 返回""
         */
        if (!StringUtils.containsIgnoreCase(url, "?")
                || !StringUtils.containsIgnoreCase(url, "aid=")
                || !StringUtils.containsIgnoreCase(url, "sid=")
                || !StringUtils.containsIgnoreCase(url, "userkey=")
                || !StringUtils.containsIgnoreCase(url, "icode=")) {
            return url;
        }

        // 携程获取token逻辑
        // 截取以&aid打头的后面所有参数
        // 使用&分割
        // 将list转为map key为参数名 value为参数的值
        int i = url.indexOf("?");
        if (i == url.length()) {
            return url;
        }

        Map<String, String> paramMap = new HashMap<>();
        String paramStr = StringUtils.substring(url, i + 1, url.length());
        String[] split = paramStr.split("&");
        for (String s : split) {
            if (StringUtils.isEmpty(s)) {
                continue;
            }
            String[] keyValue = s.split("=");
            if (StringUtils.isEmpty(keyValue[0])) {
                continue;
            }
            paramMap.put(keyValue[0].toLowerCase(), keyValue[1]);
        }

        // 强制更新uuid
        String uuid = UUID.randomUUID().toString().replace("-", "");
        paramMap.put("uuid", uuid);
        // 分销商账号
        String aid = paramMap.get("aid") == null ? "" : paramMap.get("aid");
        String sid = paramMap.get("sid") == null ? "" : paramMap.get("sid");
        // 用户秘钥，可以问携程业务索取
        String userKey = paramMap.get("userkey") == null ? "" : paramMap.get("userkey");
        // 服务号，可以问携程业务索取
        String icode = paramMap.get("icode");
        if (StringUtils.isBlank(icode)) {
            return url;
        }

        // 生成token
        String data = String.format("aid=%s&sid=%s&userkey=%s&icode=%s&uuid=%s", aid, sid, userKey, icode, uuid);
        String token = SHA256Utils.getSHA256StrJava(data);

        // 拼接url，加上token，去除userKey
        paramMap.put("token", token);
        paramMap.remove("userkey");
        String prefixUrl = StringUtils.substring(url, 0, i);
        String param = paramMap.entrySet().stream().map(e -> String.format("%s=%s", e.getKey(), e.getValue())).collect(Collectors.joining("&"));
        String result = String.format("%s?%s", prefixUrl, param);
        log.info("携程获取token方法返回值data：{}、result：{}", data, result);
        return result;
    }
}
